/**
 * User: hou wanchun
 * Date: Feb 25, 2003
 * Time: 5:14:32 PM
 */
package com.ecomm.util;

import com.ecomm.exception.DBException;

import java.io.InputStream;
import java.io.Reader;
import java.sql.*;

/**
 * 用于数据库存取的接口定义。
 */

public interface DB
{
    /**
     * 创建一个java.sql.Statement对象
     *
     * @return
     * @throws DBException
     */
    public Statement createStatement() throws DBException;

    public Statement createStatement(int resultSetType, int resultSetConcurrency) throws DBException;

    /**
     * 用指定的SQL语句创建java.sql.PreparedStatement对象
     *
     * @param sSQL
     * @return
     * @throws DBException
     */
    public PreparedStatement createPreparedStatement(String sSQL) throws DBException;

    public PreparedStatement createPreparedStatement(String sSQL, int resultSetType, int resultSetConcurrency) throws DBException;

    /**
     * 用指定的SQL语句创建java.sql.CallableStatement对象
     *
     * @param sSQL
     * @return
     * @throws DBException
     */
    public CallableStatement createCallableStatement(String sSQL) throws DBException;

    public CallableStatement createCallableStatement(String sSQL, int resultSetType, int resultSetConcurrency) throws DBException;


    /**
     * 开始一个数据库事务
     *
     * @throws DBException
     */
    public void startTransaction() throws DBException;

    /**
     * 正确结束数据库事务
     *
     * @throws DBException
     */
    public void endTransaction() throws DBException;

    /**
     * 回滚数据库事务
     *
     * @throws DBException
     */
    public void rollbackTransaction() throws DBException;

    /**
     * 执行一个查询SQL语句并且返回结果集
     *
     * @param sSQL
     * @return
     * @throws DBException
     */
    public ResultSet executeQuery(String sSQL) throws DBException;

    /**
     * 执行一个更新语句并且返回影响的记录条数
     *
     * @param sSQL
     * @return
     * @throws DBException
     */
    public int executeUpdate(String sSQL) throws DBException;

    /**
     * 取得当前数据库连接的数据库元数据对象
     *
     * @return
     * @throws DBException
     */
    public DatabaseMetaData getDatabaseMetaData() throws DBException;

    /**
     * 取得当前数据库连接的数据库类型，具体类型定义参考接口DBType中的定义。
     *
     * @return
     * @throws DBException
     */
    public String getDatabaseType() throws DBException;

    /**
     * 关闭数据库对象，并且将所有打开的对象全部关闭。
     */
    public void close();


    /**
     * 更新clob字段的值
     *
     * @param tablename
     * @param fieldname
     * @param condtion
     * @param value
     * @throws DBException
     */
    public void updateClob(String tablename, String fieldname, String condtion, String value) throws DBException;

    public void updateClob(String tablename, String fieldname, String condtion, Reader reader, int length) throws DBException;

    /**
     * 更新blob字段的值
     *
     * @param tablename
     * @param fieldname
     * @param condtion
     * @param value
     * @throws DBException
     */
    public void updateBlob(String tablename, String fieldname, String condtion, byte value[]) throws DBException;

    public void updateBlob(String tablename, String fieldname, String condtion, InputStream input, int length) throws DBException;

    /**
     * 取得clob字段的值
     *
     * @param tablename
     * @param fieldname
     * @param condtion
     * @return
     * @throws DBException
     */
    public String getClob(String tablename, String fieldname, String condtion) throws DBException;

    /**
     * 取得blob字段的值，并且将结果填入一个字节数组中
     *
     * @param tablename
     * @param fieldname
     * @param condition
     * @return
     * @throws DBException
     */
    public byte[] getBlob(String tablename, String fieldname, String condition) throws DBException;

    /**
     * 取得一个clob字段的输出流对象
     *
     * @param tablename
     * @param fieldname
     * @param condtion
     * @return
     * @throws DBException
     */
    public Reader getClobOutputStream(String tablename, String fieldname, String condtion) throws DBException;

    /**
     * 取得一个blob字段的输出流对象
     *
     * @param tablename
     * @param fieldname
     * @param condtion
     * @return
     * @throws DBException
     */
    public InputStream getBlobOutputStream(String tablename, String fieldname, String condtion) throws DBException;

    /**
     * 检测数据库是否被关闭。
     *
     * @return
     */
    public boolean isClosed();

    /**
     * 输出现有db占用资源的情况
     *
     */
    public void getResourceInfo();


}
